package classDuoTai01;

public class Test {
    public static void main(String[] args) {
        //多态方式创建对象
        Person p1 = new Student("多撒范德萨", 5215145, 100);
        p1.show();
		/*
		 当子类变量跟父类有一样的变量时候，用的是父类的变量
		 对于成员变量，编译看左边，运行看左边
		 用的是父类的变量，所以不是张三，18
		 
		 对于成员方法，编译看左边，运行看右边
		 用的是子类的方法，所以是学生的方法
		 因为子类重写了父类的方法，子类在虚方法表中覆盖了父类的方法
		 所以没输入父类的方法"我是人类"，而是子类的方法
		 */
        ;

        // p1.showMyScore(); //会报错
        /*
         * 多态的弊端
         * 不能调用子类特有的方法
         * 因为编译看左边，父类没有子类特有的方法，编译不了，自然报错
         *
         * 解决办法，变回子类类型
         * 转化不能转成别的类型
         * */
		/*
          Student p2=(Student)p1;
          p2.showMyScore();
		*/
        //升级版写法
        //p1是不是Studen类型，如果是强制转成Studnt类型，名字是p2
        if (p1 instanceof Student p2) {
            p2.showMyScore();
        }

        /*
         * 多态要用子类特有方法还是有点麻烦了
         * 所以建议使用抽象类的方法，见02
         * */
    }
}
